package com.xbongbong.saas.model;

import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.saas.domain.entity.BusinessProductEntity;
import com.xbongbong.saas.domain.entity.TransferProductEntity;

import java.util.List;
import java.util.Map;

/**
 * @author feng.zheng
 * @version v1.0
 * @date 2019/2/16 14:31
 * @since v1.0
 */
public interface TransferProductModel extends IModel<TransferProductEntity> {
    /**
     * 调拨单产品数据插入
     *
     * @param entity 调拨单产品实体
     * @return Integer
     * @throws XbbException 异常
     * @author feng.zheng
     * @date 2019-02-01 15:16
     */
    @Override
    Integer insert(TransferProductEntity entity) throws XbbException;

    /**
     * 调拨单产品数据更新
     *
     * @param entity 调拨单产品实体
     * @return Integer
     * @throws XbbException 异常
     * @author feng.zheng
     * @date 2019-02-01 15:17
     */
    @Override
    Integer update(TransferProductEntity entity) throws XbbException;

    /**
     * 调拨单产品数据查询多个
     *
     * @param param 参数
     * @return List<TransferProductEntity>
     * @author feng.zheng
     * @date 2019-02-01 15:18
     */
    @Override
    List<TransferProductEntity> findEntitys(Map<String, Object> param);

    /**
     * 调拨单产品数据查询条数
     *
     * @param param 参数
     * @return java.lang.Integer
     * @author feng.zheng
     * @date 2019-02-01 15:18
     */
    @Override
    Integer getEntitysCount(Map<String, Object> param);

    /**
     * 调拨单产品数据单条查询
     *
     * @param key    主键ID
     * @param corpid 公司ID
     * @return java.lang.Integer
     * @author feng.zheng
     * @date 2019-02-01 15:19
     */
    TransferProductEntity getByKey(Long key, String corpid);

    /**
     * 根据主键删除调拨单产品
     *
     * @param key    主键
     * @param corpid 公司id
     * @return java.lang.Integer
     * @author feng.zheng
     * @date 2019/2/19 14:49
     */
    Integer deleteByKey(Long key, String corpid);


    /**
     * 根据调拨单id删除
     *
     * @param transferId 调拨单id
     * @param corpid     公司id
     * @return java.lang.Integer
     * @author feng.zheng
     * @date 2019/2/19 14:51
     */
    Integer deleteByTransferId(Long transferId, String corpid);

    /**
     * join产品表
     *
     * @param param
     * @return java.util.List<com.xbongbong.saas.domain.entity.TransferProductEntity>
     * @author feng.zheng
     * @date 2019/2/19 15:10
     */
    List<TransferProductEntity> findEntitysJoinProduct(Map<String, Object> param);

    /**
     * 产品名称或编号通过产品名称或编号查询对应的调拨单id
     *
     * @param corpid       公司id
     * @param nameOrNoLike 产品名称或编号通过产品名称或编号查询对应的调拨单id
     * @return TransferIds
     */
    List<Long> findTransferIdsByRelaProNameOrNo(String corpid, String nameOrNoLike);

    /**
     * 根据id批量删除
     * @param idList
     * @param corpid
     * @return
     */
    Integer deleteBatch(List<Long> idList, String corpid, Integer del);

    /**
     * 获取调拨单关联产品
     *
     * @param id id
     * @param corpid 公司id
     * @return 产品
     */
    List<TransferProductEntity> getProductsByTransferId(Long id, String corpid);

    /**
     * 获取调拨单关联产品
     *
     * @param id id
     * @param corpid 公司id
     * @param delIn
     * @return 产品
     */
    List<TransferProductEntity> getProductsByTransferId(Long id, String corpid, List<Integer> delIn);

    List<BusinessProductEntity> findProductNum(Map<String,Object> param);

    Integer updateBatch(List<TransferProductEntity> list, String corpid);

    Long isProductSubAttrExist(String attr, String corpid, Integer isArray);

    void insertBatch(List<TransferProductEntity> addTransferProductEntityList);

    Integer updateOutstock(List<TransferProductEntity> list, String corpid);

    Integer updateInstock(List<TransferProductEntity> list, String corpid);

    List<String> getCorpids();

    Integer findProductNumCount(Map<String, Object> param);

    /**
     * 子表单数字字段汇总
     * @param corpid 公司id
     * @param field 需要汇总的字段
     * @param refId 单据id
     * @param productIdIn 单据在该产品关联的产品id 如生产单有物料产品和成品产品 refId为生产单id productIdIn为物料产品的id
     * @return
     */
    Double summaryByAttr(String field,String corpid,  Long refId, List<Long> productIdIn);

    Double summaryByAttrFromOutSide(String product_num, String corpid, Long refId, List<Long> productIdIn);

    List<TransferProductEntity> getProductsByTransferIdIn(String corpid, List<Long> refIdIn);

    Double calcuateByAttrFromOutSide(String field1, String field2, String corpid, Long refId, List<Long> productIdIn);

    Long countProductSub(String attr, String corpid, Integer isArray);

    List<TransferProductEntity> getProductWithSubData(String attr, String corpid, Integer isArray, Long idGte, Integer limit);

    void deleteByTransferIds(List<Long> transferIds, String corpid);


    Integer updateMulti(List<TransferProductEntity> list, String corpid);
}
